collegamentoMezzi:-
	findall(_,
			(areeGiorno(Giorno,Aree),
			collegaAree(Aree,Collegamenti),
			assert(collegamentiGiorno(Giorno,Collegamenti))),
		_)
	.
	

collegaAree(Aree,Collegamenti):-
	Aree=[A|[B|[]]],
	(collegamento(Id,A,B)->
		IdC=Id;
		(idCollegamento(IdC),
		 percorso(A,P),
		 length(P,L),
		 ith(L,P,S1),
		 percorso(B,[S2|_]),
		 ( (collega(S1,S2,Collegamento),!);
		   (collegaConScambio(S1,S2,Collegamento),!);
		   (collegamenti(IdF1,S1),collegamenti(IdF2,S2),collegaConScambi(IdF1,IdF2,3,Collegamento),!);
		   (Collegamento=[])	
		 ),
		 assert(collegamento(IdC,Collegamento))
		)
	),
	assert(collegamento(IdC,A,B)),
	Collegamenti=[IdC],
	odbc_transaction(commit).

collegaAree(Aree,Collegamenti):-
	Aree=[A|[B|AreeRest]],
	not(AreeRest=[]),
	collegaAree([B|AreeRest],CollegamentiRest),
	(collegamento(Id,A,B)->
		IdC=Id;
		(idCollegamento(IdC),
		 percorso(A,P),
		 length(P,L),
		 ith(L,P,S1),
		 percorso(B,[S2|_]),
		 ( (collega(S1,S2,Collegamento),!);
		   (collegaConScambio(S1,S2,Collegamento),!);
		   (collegamenti(IdF1,S1),collegamenti(IdF2,S2),collegaConScambi(IdF1,IdF2,3,Collegamento))
		 ),
		 assert(collegamento(IdC,Collegamento))
		)
	),
	assert(collegamento(IdC,A,B)),
	append([IdC],CollegamentiRest,Collegamenti),
	odbc_transaction(commit).


collega(S1,S2,Collegamento):-
	collegamenti(IdF1,S1),
	collegamenti(IdF2,S2),
	collegaConScambi(IdF1,IdF2,0,Collegamento),!.


collegaConScambio(S1,S2,Collegamento):-
	collegamenti(IdF1,S1),
	collegamenti(IdF2,S2),
	collegaConScambi(IdF1,IdF2,1,Collegamento),!.


collegaConScambi(IdF1,IdF2,Scambi,Collegamento):-
	Scambi=0,
	not(IdF1==IdF2),
	fermateMezzi(IdM,IdF1),
	fermateMezzi(IdM,IdF2),
	Collegamento=[IdF1,IdM,IdF2],!.

collegaConScambi(IdF1,IdF2,Scambi,Collegamento):-
	not(Scambi==0),
	not(IdF1==IdF2),	
	fermateMezzi(IdM,IdF1),
	not(fermateMezzi(IdM,IdF2)),
	fermateMezzi(IdM,IdF),
	not(IdF=IdF1),
	S is Scambi-1,
	collegaConScambi(IdF,IdF2,S,CollegamentoRest),
	append([IdF1,IdM],CollegamentoRest,Collegamento),!.
			


idCollegamento(ID):-
	idc(IDC),
	ID is +(IDC,1),
	retract(idc(IDC)),
	assert(idc(ID)).




